#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
//int isPrime(int n)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 2; i <= n; i++)
//	{
//		int found = 1;
//		for (j = 2; j <= i; j++)
//		{
//			if (i % j == 0)
//			{
//				found = 0;
//				return 0;
//			}
//		}
//		if (!found)
//		{
//			return 0;
//		}
//	}
//}
//int isPrime(int x)
//{
//	if (x < 2)
//	{
//		return 0;
//	}
//	else
//	{
//		for (int i = 2; i <= x; i++)
//		{
//			if (x % i == 0)
//			{
//				return 0;
//			}
//		}
//		return 1;
//	}
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	/*int x = 0;
//	isPrime(x);*/
//	int i = 0;
//	int j = 0;
//	for (i = 2; i < n; i++)
//	{
//		for (j = 2; j < n; j++)
//		{
//			if (isPrime(i) && isPrime(j))
//			{
//				if (i + j == n)
//				{
//					printf("%d = %d + %d\n", n, i, j);
//				}
//			}
//		}
//	}
//	return 0;
//}
//int IsAutomorphic(int x)
//{
//	if (x == 0)
//	{
//		return 1;
//	}
//	else if (x == 1)
//	{
//		return 1;
//	}
//	else if (x > 1)
//	{
//		int squre = x * x;
//		int count_digit = 0;
//		int count = 0;
//		int temp = x;
//		while (temp)
//		{
//			temp /= 10;
//			count++;
//		}
//		int temp = x;
//		int i = pow(10, count - 1);
//		int j = temp / i;
//		int result = squre - j * i;
//		if (result == x)
//		{
//			return 1;
//		}
//		else
//		{
//			return 0;
//		}
//	}
//}
//#include<stdio.h>
//int isPrime(int x)
//{
//	if (x < 2)
//	{
//		return 0;
//	}
//	for (int i = 2; i <= sqrt(x); i++)
//	{
//		if (x % i == 0)
//		{
//			return 0;
//		}
//	}
//		return 1;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int i = 0;
//	for (i = n + 1; i <= 100000000; i++)
//	{
//		if (isPrime(i) && isPrime(i + 2))
//		{
//			printf("%d %d", i, i + 2);
//			break;
//		}
//	}
//	return 0;
//}
#include<stdio.h>
int isTndenpence(int x)
{
	int arr[10000];
	int i = 0;
	int temp = x;
	//int count = 0;
	while (temp == 1)
	{
		while (temp)
		{
			arr[i++] = temp % 10;
			temp /= 10;
		}
		int count = i;
		int sum = 0;
		for (i = 0; i < count; i++)
		{
			sum += pow(arr[i], 2);
		}
		temp = sum;
		//count++;
	}
	return 1;
}
int isTndenpence_2(int x)
{
	int arr[10000];
	int i = 0;
	int temp = x;
	int count = 0;
	while (temp == 1)
	{
		while (temp)
		{
			arr[i++] = temp % 10;
			temp /= 10;
		}
		int count = i;
		int sum = 0;
		for (i = 0; i < count; i++)
		{
			sum += pow(arr[i], 2);
		}
		temp = sum;
		count++;
	}
	return count;
}

int isPrime(int x)
{
	if (x < 2)
	{
		return 0;
	}
	int i = 0;
	for (i = 2; i <= sqrt(x); i++)
	{
		if (x % i == 0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int i = 0;
	int j = 0;
	isTndepence();
	int count = 0;
	int indepence = 0;
	int found = 0;
	for (i = n; i <= m; i++)
	{
		found = 0;
		if (isIndepence(i))
		{
			count = isIndepence_2(i);
			if (isPrime(i))
			{
				indepence = count * 2;
				printf("%d %d\n", indepence, count);
			}
			else
			{
				printf("%d %d\n",indepence, count);
			}
			found = 1;
		}
	}
	if (found)
	{
		printf("SAD\n");
	}
	return 0;
}